package tec ;
import java.util.*;


class Autobus implements Bus, Transport
{
    private JaugeNaturel jaugeAssis;
    private JaugeNaturel jaugeDebout;
    private  HashSet<Passager> passagers;
    private int nbPassagers ;
    public int numeroArret = 0;
	
    protected Autobus(int nbPlaceAssise, int nbPlaceDebout)
    {   if(nbPlaceAssise <0 || nbPlaceDebout <0)
	    throw new IllegalArgumentException("Les nombres de place doivent etre positif");

	jaugeAssis  = new JaugeNaturel(0, nbPlaceAssise, 0);
	jaugeDebout = new JaugeNaturel(0, nbPlaceDebout, 0);

        nbPassagers = 0;
        passagers = new HashSet<Passager>();
    }

	public void allerArretSuivant() throws TecInvalidException,IllegalStateException{
	numeroArret++;
       /*Parcours du tableau à l'envers pour éviter les conflits
        * lors de la decsente (suppresion d'un passager
        */
	final Iterator<Passager> it= passagers.iterator();
	Bus b = new Bus() {   
		Iterator<Passager> ti=it;
		public void allerArretSuivant() throws TecInvalidException{}
		public boolean aPlaceAssise(){return Autobus.this.aPlaceAssise();}
		public boolean aPlaceDebout(){return Autobus.this.aPlaceDebout();}
		public void demanderChangerEnAssis(Passager p) throws IllegalStateException  {Autobus.this.demanderChangerEnAssis(p);} 
		public void demanderChangerEnDebout(Passager p) throws IllegalStateException {Autobus.this.demanderChangerEnDebout(p);}
   		public void demanderPlaceAssise(Passager p){Autobus.this.demanderPlaceAssise(p);}
   		public void demanderPlaceDebout(Passager p){Autobus.this.demanderPlaceDebout(p);}
		public void demanderSortie(Iterator<Passager> index,Passager p){
		Autobus.this.demanderSortie(p);
		index.remove();
   		 }

   		public void demanderSortie(Passager p){
			demanderSortie(ti,p);
		}
	};

	
	PassagerAbstrait pa=null;
	
	for(;it.hasNext();)
	{
		pa = (PassagerAbstrait) it.next();
		if(pa.getDestination()-numeroArret<0)
			throw new IllegalStateException();
	   	pa.nouvelArret(b,numeroArret);	
       }
    }
        public void demanderSortie(Passager p)
    {
	if(p.estDebout())
	    jaugeDebout.decrementer();
	else if (p.estAssis())
	    jaugeAssis.decrementer();
	
	p.accepterSortie();
    }
    
    public boolean aPlaceAssise()
    {
	return (!jaugeAssis.estRouge()); 
    }
    

    public boolean aPlaceDebout()
    {
	return (!jaugeDebout.estRouge());
    }	    
	
    public void demanderChangerEnAssis(Passager p) throws IllegalStateException  { 
	if(p.estAssis())
		throw new IllegalStateException();
          p.accepterPlaceAssise();
          jaugeAssis.incrementer();
          jaugeDebout.decrementer();
    }
	    
    public void demanderChangerEnDebout(Passager p) throws IllegalStateException 
    { 	
	if (p.estDebout())
		throw new IllegalStateException();
          p.accepterPlaceDebout();
          jaugeAssis.decrementer();
          jaugeDebout.incrementer();
          
    }

    public void demanderPlaceAssise(Passager p)
    {

	p.accepterPlaceAssise();
	boolean i = passagers.add(p);
	if(i==false)
	    System.err.println("Passager not add");
	else{
	    nbPassagers++;
	    jaugeAssis.incrementer();
	}
 
    } 

    public void demanderPlaceDebout(Passager p)
    {

          p.accepterPlaceDebout();
	  boolean i = passagers.add(p);
	  if(i==false)
	    System.err.println("Passager not add");
	  else{
	       nbPassagers++;
	      jaugeDebout.incrementer();
	  }
    }


    

   public String toString() {
       return "[arret:"+ numeroArret + ", assis:" + jaugeAssis +
          ", debout:" + jaugeDebout + "]";
    }
    
 

}
